#ifndef _SRC_AIOTENTITY_H_
#define _SRC_AIOTENTITY_H_

#include "MQTT/Params.h"
#include "Core/Interface.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 注册模式
 */
typedef enum {
    unknownRegMode     = 0x00,               /**未知模式*/
    deviceNumber       = 0x01,               /**设备号模式*/
    thirdTuple         = 0x02,               /**三元组模式*/
} RegisterMode;

/**
 * @brief 心跳信息
 */
typedef struct {
    uint32_t    interval;
    uint8_t     maxLostTimes;
    uint32_t    lostTimes;
    uint64_t    lastSendAt;
} AiotHeartBeat;

/**
 * @brief 重连信息
 */
typedef struct {

    uint8_t     enabled;
    uint32_t    interval;
    uint64_t    lastRetryTime;
    uint8_t     backOffEnabled;
    int32_t     randMs;
    int32_t     counter;
} AiotReconnectInfo;

/**
 * @brief 网络统计信息
 */
typedef struct {
    uint8_t         networkType;       /** 0: TCP, 1: TLS */
    uint64_t        connectAt;         /**连接时间*/
    uint64_t        failedAt;          /**失败时间*/
    uint32_t        connectUsed;       /**连接耗时*/
    int32_t         failedCode;        /**连接失败错误码*/
    uint64_t        rtt;               /**heartbeat rtt*/
} AiotNetStats;

/**
 * @brief aiot 实体
 */
typedef struct {
    void *              netHandle;;             /**网络句柄*/
    RegisterMode        registerMode;           /**注册方式*/
    AiotServerAddress   aiotServer;             /**服务信息*/
    AiotDeviceInfo      aiotAccess;             /**接入信息,三元组信息*/
    AiotProductInfo      aiotDeviceInfo;         /**设备信息*/
    AiotHeartBeat       hblInfo;                /**心跳信息*/
    AiotReconnectInfo   reconnectInfo;          /**重连信息*/
    AiotCredInfo        channelCred;            /**安全通道信息*/
    uint16_t            keepAlive;              /**保持连接的时间*/
    int32_t             connectTimeout;         /**连接超时时间*/
    int32_t             sendDataTimeout;        /**发送数据超时时间*/
    int32_t             recvDataTimeout;        /**接收数据超时时间*/
    int32_t             destroyTimeout;         /**实体销毁超时时间*/
    void*               sendMutex;              /**数据发送锁*/
    void*               recvMutex;              /**数据接收锁*/
    void*               dataMutex;              /**对象锁*/
    void*               context;                /**用户上下文*/
    uint8_t             execEnabled;
    uint32_t            execCount;
    AiotEventHandler    eventHandler;           /**事件回调*/
    AiotNetStats        netStats;               /**网络统计信息*/
} AiotEntity;

/**
 * @brief 初始化aiot entity
 * @param aiotEntity
 * @param context
 */
void initialAiotEntity(AiotEntity *aiotEntity, void *context);
/**
 * @brief aiot entity 去初始化
 * @param aiotEntity
 */
void deInitialAiotEntity(AiotEntity* aiotEntity);
/**
 * @brief 创建aiot net handler
 * @param aiotEntity
 * @param type
 * @return
 */
int32_t createAiotNet(AiotEntity* aiotEntity,SocketType type);
/**
 * @brief 销毁网络
 * @param aiotEntity
 */
void destroyAiotNet(AiotEntity* aiotEntity);
/**
 * @brief 销毁网络
 * @param aiotEntity
 */
void destroyAiotNetUnlock(AiotEntity* aiotEntity);
/**
 * @brief aiot实体 减少执行次数
 * @param aiotEntity
 */
void aiotExecCountDec(AiotEntity* aiotEntity);
/**
 * @brief aiot实体 增加执行次数
 * @param aiotEntity
 */
void aiotExecCountInc(AiotEntity* aiotEntity);
/**
 * @brief aiot状态是否可执行
 * @param entity
 * @return
 */
int8_t aiotEnableExecute(AiotEntity* entity);
/**
 * @brief aiot 不可执行
 * @param entity
 * @return
 */
void disableAiotExecute(AiotEntity *entity);

#ifdef __cplusplus
}
#endif
#endif //_SRC_AIOTENTITY_H_
